/**
 * @file uart.h
 * @author your name (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2023-07-24
 *
 * @copyright Copyright (c) 2023
 *
*/
#ifndef _sv17f_UART_H_
#define _sv17f_UART_H_

/*
指令码:固定AA
指令类型：用来区分指令类型
数据长度：指令中的数据字节数
数据：指令中的相关数据，当数据长度为1时，表示只有CMD，没有数据位
和校验：为之前所有字节之和的低8位，即起始码到数据相加后取低8位。
数据格式：发送的数据或指令高8位数据在前，低8位在后。
*/

//通信协议
//1、播放状态定义：系统上电处于停止状态
#define STATUS_STOP 0x00 //停止 
#define STATUS_PLAY 0x01 //播放
#define STATUS_PAUSE 0x02 //暂停

//2、盘符定义：切换盘符后处于停止状态
#define PAN_USB 0x00 //USB
#define PAN_SD 0x01 //SD
#define PAN_FLASH 0x02 //FLASH
#define PAN_NO_DEVICE 0xFF //NO_DEVICE

//3、音量：音量总共31级，0-31级，上电默认为20级
#define VOLUME_LEVEL_0 0
#define VOLUME_LEVEL_1 1
#define VOLUME_LEVEL_2 2
#define VOLUME_LEVEL_3 3
#define VOLUME_LEVEL_4 4
#define VOLUME_LEVEL_5 5
#define VOLUME_LEVEL_6 6
#define VOLUME_LEVEL_7 7
#define VOLUME_LEVEL_8 8
#define VOLUME_LEVEL_9 9
#define VOLUME_LEVEL_10 10
#define VOLUME_LEVEL_11 11
#define VOLUME_LEVEL_12 12
#define VOLUME_LEVEL_13 13
#define VOLUME_LEVEL_14 14
#define VOLUME_LEVEL_15 15
#define VOLUME_LEVEL_16 16
#define VOLUME_LEVEL_17 17
#define VOLUME_LEVEL_18 18
#define VOLUME_LEVEL_19 19
#define VOLUME_LEVEL_20 20
#define VOLUME_LEVEL_21 21
#define VOLUME_LEVEL_22 22
#define VOLUME_LEVEL_23 23
#define VOLUME_LEVEL_24 24
#define VOLUME_LEVEL_25 25
#define VOLUME_LEVEL_26 26
#define VOLUME_LEVEL_27 27
#define VOLUME_LEVEL_28 28
#define VOLUME_LEVEL_29 29
#define VOLUME_LEVEL_30 30

// 4、播放模式定义：商店默认为单曲停止
#define LOOP_MODE_ALL 0x00 //全盘循环：按顺序播放全盘曲目，播放完后循环播放
#define LOOP_MODE_SINGLE 0x01 //单曲循环：一直循环播放当前曲目
#define LOOP_MODE_SINGLE_STOP 0x02 //单曲停止：播放完当前曲目一次停止
#define LOOP_MODE_ALL_RANDOM 0x03 //全盘随机：随机播放盘符内曲目
#define LOOP_MODE_DIR 0x04 //目录循环：按顺序播放当前文件夹内曲目，播放完后循环播放，目录不包含子目录
#define LOOP_MODE_DIR_RANDOM 0x05 //目录随机：在当前目录内随机播放，目录不包含子目录
#define LOOP_MODE_DIR_SEQUENCE 0x06 //目录顺序播放：按顺序播放当前文件夹内曲目，播放完后停止，目录不包含子目录
#define LOOP_MODE_ALL_SEQUENCE_STOP 0x07 //顺序播放按顺序播放全盘曲目，播放完后停止

// 5、EQ定义：上电默认EQ为NORMAL（00）
#define EQ_NOMARL 0x00 // NOMARL
#define EQ_POP 0x01 // POP
#define EQ_ROCK 0x02 // ROCK
#define EQ_JAZZ 0x03 // JAZZ
#define EQ_CLASSIC 0x04 // CLASSIC

/*
6、组合播放定义：组合播放是按文件名来组合，文件要求存储在“XY”文件夹下，可以巴瑶族喝的文件名称更改为两个字节的名称，一般建议用数字表示。如：01.MP3，02.mp3,也可以用两个字母或汉字命名
*/

/**
 * @brief 
 * @param volume        音量
 * @param loop_mode     循环模式
 * @param eq            音乐风格
 * @param pan           盘符指定路径
 */
struct sv17f_config_s {
    uint32_t volume;
    uint8_t loop_mode;
    uint8_t eq;
    uint8_t pan;
};

void sv17f_uart_task(void* arg);

void sv17f_init(const struct sv17f_config_s *config);

/*计算校验码*/
uint8_t check_sum(uint8_t *ck_buf, uint8_t size);

//音量设置 0xAA, 0x13, 0x01, 音量, SM
int sv17f_set_vol(uint8_t vol);
//设置循环模式 0xAA, 0x18, 0x01, 循环模式, SM
int sv17f_set_loop(uint8_t loop);
//设置循环次数 0xAA, 0x19, 0x02, 次数高, 次数低, SM
int sv17f_set_count(uint8_t count);
//EQ设置 0xAA, 0x1A, 0x01, EQ, SM
int sv17f_set_eq(uint8_t eq);
//指定曲目 0xAA, 0x07, 0x02, 曲目高, 曲目低, SM
int sv17f_set_sound(uint16_t sound);
//指定盘符指定路径 0xAA, 0x08, 长度, 盘符, 路径, SM
int sv17f_set_pan(uint8_t pan);
//切换到指定盘符径 0xAA, 0x0B, 0x01, 盘符, SM
int sv17f_set_sel_pan(uint8_t pan);
//指定曲目播放 0xAA, 0x16, 0x03, 盘符, 曲目高, 曲目低, SM
int sv17f_set_sel_sound_paly(uint8_t pan, uint16_t sound);
//指定路径播放 0xAA, 0x17, 长度, 盘符, 路径, SM
int sv17f_set_sel_dir_paly(uint8_t pan, uint8_t dir);
//选曲不播放 0xAA, 0x1F, 0x02, 曲目高, 曲目低, SM
int sv17f_check_sel_sound(uint16_t sound);

// 查询播放状态
uint8_t sv17f_play_status(uint16_t timeout);
// 查询当前在线盘符
uint8_t sv17f_online_pan(uint16_t timeout);
// 查询当前播放盘符
uint8_t sv17f_use_pan(uint16_t timeout);
// 查询总曲目
uint8_t sv17f_sum_sound(uint16_t timeout);
// 查询当前曲目
uint8_t sv17f_cur_sound(uint16_t timeout);
// 查询文件夹目录曲目
uint16_t sv17f_dir_sound(uint16_t timeout);
// 查询文件夹目录总曲目
uint16_t sv17f_sum_dir_sound(uint16_t timeout);

// 播放
int sv17f_play();
// 暂停
int sv17f_pasue();
// 停止
int sv17f_stop();
// 上一曲
int sv17f_sound_up();
// 下一曲
int sv17f_sound_down();
// 音量加
int sv17f_vol_up();
// 音量减
int sv17f_vol_down();
// 上一文件目录
int sv17f_dir_up();
// 下一文件目录
int sv17f_dir_down();
// 结束播放
int sv17f_release();

#endif